from flask import get_flashed_messages, request, flash, render_template, redirect, url_for, session
from models.rol import metadata, Rol
from models.database import db_session
import sys
#import bz2

from models.rolManager import RolManager
from models.proyectoManager import ProyectoManager
from models.usuarioManager import UsuarioManager

rolMgr = RolManager()
proyectoMgr = ProyectoManager()
usuarioMgr = UsuarioManager()

"""
Clase que contiene los metodos relacionados con la gestion de roles por usuario
"""

def adRolPorUsuario():
    """ Metodo encargado de la gestion de roles por usuario de un proyecto """
    filtro=""
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        return paginarRolPorUsuario(idproyecto, proyecto, 1, "")
    if request.method == "GET":       
        if session['idproyecto']:
            pagina = 1
            if request.args.getlist("pagina"):
                pagina = request.args.getlist("pagina")[0]
            idproyecto = session['idproyecto']
            proyecto = proyectoMgr.getProyecto(idproyecto)
            return paginarRolPorUsuario(idproyecto, proyecto,pagina , "")
        else:
            flash(u"Seleccionar un proyecto antes de realizar la operaci\u00f3n", "error")
            return redirect(url_for("configurarProyecto", action= "adRolPorUsuario"))
        
def agregarRolUsuario():
    """ Metodo encargado de agregar roles al usuario del proyecto """
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        idroles = request.form.getlist("check")
        idusuario = request.form["idusuario"]
        usuario = usuarioMgr.getUsuario(idusuario)
        roles =[]
        for i in xrange(0, len(idroles)):
            rol = rolMgr.getRol(idroles[i])
            roles.append(rol)
                
        usuario.roles=roles
        usuarioMgr.guardarUsuarioRol(usuario)          
        return redirect(url_for("adRolPorUsuario", idproyecto=idproyecto))
    else:
        idproyecto = request.args.getlist("idproyecto")[0]
        idusuario = request.args.getlist("idusuario")[0]
        rolesUsuario = rolMgr.getRolesDelUsuarioPorProyecto(idusuario,idproyecto)
        usuario = usuarioMgr.getUsuario(idusuario)
        roles = rolMgr.getRolFiltradoPorNombreProyecto("", idproyecto)
        if roles:
            for rolUser in rolesUsuario:
                roles.remove(rolUser)
            return render_template("agregarRolesPorUsuario.html", rolesusuario= rolesUsuario, idproyecto = idproyecto, usuario = usuario, roles=roles, form = request.form)
        else:
            flash("No exite ningun rol en el proyecto, debe agregar al menos uno")
            return redirect(url_for("adRolPorUsuario", idproyecto=idproyecto))

def desasignarRolDeUsuario():
    """ Metodo encargado de desasignar roles del usuario en el proyecto """
    if request.method == "GET":
        idproyecto = request.args.getlist("idproyecto")[0]
        idusuario = request.args.getlist("idusuario")[0]
        usuario = usuarioMgr.getUsuario(idusuario)
        usuario.roles=[]
        usuarioMgr.eliminarUsuarioRol(usuario)          
        return redirect(url_for("adRolPorUsuario", idproyecto=idproyecto))

def paginarRolPorUsuario(idproyecto, proyecto, pagina, filtro):
    """Metodo encargado de la busqueda de usuarios a partir de un filtro"""
    porPagina= 5
    pagina = int(pagina)
    total = usuarioMgr.getUsuariosPorProyectoPaginado(idproyecto, nombre=filtro, desde=None, hasta=None)
    if total % porPagina == 0:
        cantPaginas= total/porPagina
    else:
        resto = total % porPagina
        subtotal = (total-resto)
        cantPaginas= (subtotal/porPagina) + 1
    hasta = pagina * porPagina
    desde = hasta - porPagina
    usuarios = usuarioMgr.getUsuariosPorProyectoPaginado(idproyecto, filtro, desde, hasta)
    return render_template("adRolPorUsuario.html", lista = usuarios, idproyecto = idproyecto, proyecto =proyecto,\
        filtro = filtro, form=request.form, primera=1, ultima= cantPaginas, ant= pagina-1,\
        sig=pagina +1, cantPaginas = cantPaginas, pagina = pagina)

def agregarUsuarioProyecto():
    """ Metodo encargado de agregar usuarios a un proyecto """
    filtro=""
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        filtro = request.form["filtro"]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        return paginarUsuarioProyecto(idproyecto, proyecto, 1, filtro)    
        
    if request.method == "GET":
        idproyecto = request.args.getlist("idproyecto")[0]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        if request.args.getlist("filtro"):
            filtro = request.args.getlist("filtro")[0]
        pagina = 1
        if request.args.getlist("pagina"):
            pagina = request.args.getlist("pagina")[0]
        
        return paginarUsuarioProyecto(idproyecto, proyecto, pagina, filtro)


def paginarUsuarioProyecto(idproyecto, proyecto, pagina, filtro):
    """ Metodo encargado de la busqueda de usuarios a partir de un filtro """
    porPagina= 5
    pagina = int(pagina)
    total = usuarioMgr.getUsuariosPaginado(user=filtro, desde=None, hasta=None)
    usuariosProyecto = proyectoMgr.getUsuariosDelProyecto(idproyecto)
#     total = total - len(usuariosProyecto)
    if total % porPagina == 0:
        cantPaginas= total/porPagina
    else:
        resto = total % porPagina
        subtotal = (total-resto)
        cantPaginas= (subtotal/porPagina) + 1
    hasta = pagina * porPagina
    desde = hasta - porPagina
    usuarios = usuarioMgr.getUsuariosPaginado(filtro, desde, hasta)

#     for user in usuariosProyecto:
#         usuarios.remove(user)
    
    return render_template("agregarUsuarioProyecto.html", lista = usuarios,\
        filtro = filtro, form=request.form, primera=1, ultima= cantPaginas, ant= pagina-1,\
        sig=pagina +1, cantPaginas = cantPaginas, pagina = pagina, idproyecto=idproyecto)
        
